IME onの時、キー入力をScrapboxに渡すUserScript
元ネタ:
/sta/Scrapboxで範囲選択中にIMEをオフにしたい
compositionupdateで入力キーを受け取り、それをscrapboxに渡せばいけそうな気がした
全角と半角の変換をして渡す
2021-01-20 16:51:47 なんとか成功したみたい
ブラケティングだけ実装した
2023-11-08
08:53:25 終了
初回だけ「が残る
ほかは消えてくれる
たくさんタイプするとsleepが間に合わないかも
08:45:10 今度こそ成功
https://gyazo.com/b030ab7e426dd4d9eb012470efd1574c
1. compositionupdateを受け取る
2. 対象のキーであれば、ブラケティングボタンを押す。eventはcancelしない
3. 少し待ってから#text-inputのfocusを外す
4. compositionendを受け取る
5. 文字を消した後にfocusを戻す
08:24:39 だいぶうまくいくようになった
https://gyazo.com/25ea1a56ef6f1bc106cf628770e1b53b
<BS>の効果がなさそうだ
いや、これがないとIMEがおかしくなる
08:10:35 いや、失敗していた
blurのあとisTrusted===falseなcompositionendが発行されている
08:02:53 成功したかな?
chrome@windows11で確認
javascriptからIMEをcancelする#600823d41280f00000104ab1したあとに、compositionend eventをcatchして握りつぶすのがポイントっぽい
07:53:24 compositionendをdispatchしてもIMEが終了しない
本物のcompositionend eventが発火したときにしか有効でないのか?
07:28:58 作業ログ | 全てのKeyboardEventとCompositionEventを握りつぶすで見つけた方法を使う
07:28:27 以前のコードをIME onの時、キー入力をScrapboxに渡すUserScript 2021-01-20にstashした
05:23:51 ずいぶん前から、キー入力を消せなくなっている
focusも外れるというオマケ付き
直したい
Known Issue
/icons/done.iconIMEに入力した文字を消せない
<ESC>を使えばIMEを強制終了できるのだが、不具合が発生するのでやりたくない
ESCでIMEを強制終了するとバグる
どんな不具合が起きたかは忘れた
工夫すればIMEを終了させられるのかもしれない
scrapbox-keyboard-emulation-2で<ESC>を入力したが効き目がなかった
この前、終了できたのは何だったんだろうか?
22:02:17 方法見つけた!
javascriptからIMEをcancelする#600823d41280f00000104ab1
https://scrapbox-bundler.vercel.app?url=https://scrapbox.io/api/code/takker/IME_onの時%E3%80%81キー入力をScrapboxに渡すUserScript/script.ts&bundle&minify&run&reload
$ deno check --remote -r=https://scrapbox.io "https://scrapbox.io/api/code/takker/IME_onの時、キー入力をScrapboxに渡すUserScript/script.ts"
code:script.ts
import { takeStores, press, sleep } from "../scrapbox-userscript-std/dom.ts";
const callback = (e: CompositionEvent) => {
if (!e.isTrusted) return;
if (e.data.length === 0) return;
if (!(e.target instanceof HTMLTextAreaElement)) return;
if (e.target.id !== "text-input") return;
const { cursor, selection } = takeStores();
if (!selection.hasSingleLineSelection()) return;
switch(...e.data.pop()){
case "「": {
const button = document.getElementsByClassName('button link-button')?.0
if (!(button instanceof HTMLElement)) return;
//e.preventDefault();
//e.stopPropagation();
button.click();
const textarea = e.target;
(async () => {
await sleep(100);
textarea.blur();
await new Promise((resolve) => {
document.addEventListener("compositionend", resolve, { capture: true, once: true });
});
press("Backspace");
textarea.focus();
cursor.focus();
})();
break;
}
default:
break;
}
};
export const setup = (): () => void => {
document.addEventListener("compositionupdate", callback, { capture: true });
return () => {
document.removeEventListener("compositionupdate", callback, { capture: true });
};
};
#2023-11-08 05:24:52
#2021-01-20